/*
ajax 请求函数模块
*/
import axios from 'axios'
import store from "@/store";

/**
 * 向外部暴漏一个函数 ajax
 * @param {*} url 请求路径，默认为空
 * @param {*} data 请求参数，默认为空对象
 * @param {*} type 请求方法，默认为GET
 */

export default function ajax(data = {}, type = 'GET', ex = false) {

  const url = 'http://dyxs.sen233.com'
  // const url = ''
  // 返回值 Promise对象 （异步返回的数据是response.data，而不是response）
  return new Promise(function(resolve, reject) {

    let form = new FormData()
    let keys = Object.keys(data)
    keys.forEach(key => {
      if(data[key] !== null){
        form.append(key, data[key])
      }
    })

    // （利用axios）异步执行ajax请求
    const headers = {
      'Content-Type': 'multipart/form-data',
    };
    // if(ex){
    //   axios.defaults.headers['token-expert'] = localStorage.getItem('experttoken')
    // }else{
    //   axios.defaults.headers['token-student'] = store.getters.stuToken
    // }

    axios.defaults.headers['token-student'] = store.getters.stuToken

    let promise // 这个内部的promise用来保存axios的返回值(promise对象)
    if (type === 'GET') {
      let dataStr = '' // 数据拼接字符串，将data连接到url
      Object.keys(data).forEach(key => {
        dataStr += key + '=' + data[key] + '&'
      })
      if (dataStr !== '') {
        dataStr = dataStr.substring(0, dataStr.lastIndexOf('&'))
        url = url + '?' + dataStr
      }
      promise = axios.get(url)
    } else if (type === 'BLOB') {
      promise = axios.get(url, { responseType: 'blob' })
    } else if (type === 'PUT') {
      promise = axios.put(url, data)
    } else if (type === 'DELETE') {
      promise = axios.delete(url, data)
    } else {
      if(ex) {
        promise = axios.post(url, form, {headers})
      } else {
        promise = axios.post(url, data)
      }
      
    }

    promise.then(response => {
      // 成功回调resolve()
      if (response.data.code === '1') {
        this.$Notice.open({
          title: '账户已被登出，可以取消继续留在该页面，或者重新登录'
        });
        location.reload()
      }
      resolve(response.data)
    })
      .catch(error => {
        // 失败回调reject()
        reject(error)
      })
  })
}
